import notification from 'ant-design-vue/es/notification';

/**
 * 生成分页数据对象
 * @param {Object} params 
 * @param {Number} params.totalCount 
 * @param {Number} params.pageSize 
 * @param {Number} params.pageNo 
 * @param {Object} params.data  
 */
function createPageData(params={}){
    return {
        totalCount: params.totalCount || 0,
        pageSize: params.pageSize || 1,
        pageNo: params.pageNo || 1,
        data: params.data || []
    };
}

/**
 * 转换为页面用的Data :
 * @param {Object} data 
 * @param {String} id
 */
export function toPageData(result,pageParam) {
    if (result.code!=200&&result.code!=401) {
        notification['error']({
            message: '错误',
            description: (result || {}).message || '网络或者数据异常',
            duration: 4
        });
        return createPageData();
    } 
    console.log('pageParam',pageParam);
    return createPageData({
        totalCount: parseInt(result.data.total),
        pageSize: pageParam.pageSize,
        pageNo: pageParam.pageNo,
        data: result.data.list
    })
}

/**
 * 转换为页面用的Data（老接口）
 * @param {Object} data 
 * @param {String} id
 */
export function toPageDataForSys(result,pageParam) {
    if (result.code!=200&&result.code!=401) {
        notification['error']({
            message: '错误',
            description: (result || {}).message || '网络或者数据异常',
            duration: 4
        });
        return createPageData();
    } 
    console.log('pageParam',pageParam);
    return createPageData({
        totalCount: parseInt(result.total),
        pageSize: pageParam.pageSize,
        pageNo: pageParam.pageNo,
        data: result.rows,
    });
}

/**
 * 生成无数据的分页 Data 对象 (Promise)
 */
export function createNotPageDataPromise() {
    return Promise.resolve(createPageData());
}

/**
 * 生成分页 Data 对象 (Promise)
 * @param {Object} params
 * @param {Number} params.totalCount 
 * @param {Number} params.pageSize 
 * @param {Number} params.pageNo 
 * @param {Object} params.data  
 */
export function createPageDataPromise(params) {
    return Promise.resolve(createPageData(params));
}

/**
 * 转换为实际页面网络请求所需数据
 * @param {Object} queryParam 
 * @param {Object} pageParam 
 */
export function toPageQueryParam(queryParam={}, pageParam) {
    let param = {
        // 当前页
        pageNum: pageParam.pageNo,
        // 每页显示条数
        pageSize: pageParam.pageSize,
    }
    // 统一设置请求参数中的 "" 等同 null
    Object.keys(queryParam).forEach(key => {
        if(queryParam[key]===""||queryParam[key]==="null")queryParam[key] = null;
    });
    return Object.assign(param, queryParam);
}

/**
 * 自动提取出 data 中的数据
 * 注: code 为0时业务正常,为!0时抛出异常,若 code 需业务端处理,不应使用该方法,
 * @param {Object} result 
 */
export function toData(result) {
    if (result.code == 400) {
        notification['warning']({
            message: '提示',
            description: (result || {}).message || '网络或者数据异常',
            duration: 4
        });
        throw result;
    } else if(result.code == 401){
        // 401 则不做处理,交由统一请求拦截器处理
        console.log(result);
        throw 'break';
    } else if(result.code != 200){
        notification['error']({
            message: '错误',
            description: (result || {}).message || '网络或者数据异常',
            duration: 4
        });
        throw result;
    }
    // const msg = errorCode(res.data.code) || res.data.msg || errorCode('default')
    return result.data;
}

/**
 * 自动提取出 data 中的数据 (兼容老接口)
 * 注: code 为0时业务正常,为!0时抛出异常,若 code 需业务端处理,不应使用该方法,
 * @param {Object} result 
 */
export function toDataForSys(result) {
    if (result.code == 400) {
        notification['warning']({
            message: '提示',
            description: (result || {}).message || '网络或者数据异常',
            duration: 4
        });
        throw result;
    } else if(result.code == 401){
        // 401 则不做处理,交由统一请求拦截器处理
        console.log(result);
        throw 'break';
    } else if(result.code != 200){
        notification['error']({
            message: '错误',
            description: (result || {}).message || '网络或者数据异常',
            duration: 4
        });
        throw result;
    }
    // const msg = errorCode(res.data.code) || res.data.msg || errorCode('default')
    return result.data||result;
}

/**
 * 一键粘贴
 * @param  {String} id [需要粘贴的内容]
 * @param  {String} attr [需要 copy 的属性，默认是 innerText，主要用途例如赋值 a 标签上的 href 链接] 或者内容
 *
 * range + selection
 *
 * 1.创建一个 range
 * 2.把内容放入 range
 * 3.把 range 放入 selection
 *
 * 注意：参数 attr 不能是自定义属性
 * 注意：对于 user-select: none 的元素无效
 * 注意：当 id 为 false 且 attr 不会空，会直接复制 attr 的内容
 */
export function copyData (attr,id) {
    let target = null;
    if (attr) {
        target = document.createElement('div');
        target.id = 'tempTarget';
        target.style.opacity = '0';
        if (id) {
            let curNode = document.querySelector('#' + id);
            target.innerText = curNode[attr];
        } else {
            target.innerText = attr;
        }
        document.body.appendChild(target);
    } else {
        target = document.querySelector('#' + id);
    }

    try {
        let range = document.createRange();
        range.selectNode(target);
        window.getSelection().removeAllRanges();
        window.getSelection().addRange(range);
        document.execCommand('copy');
        window.getSelection().removeAllRanges();
        console.log('复制成功')
    } catch (e) {
        console.log('复制失败')
    }

    if (attr) {
        // remove temp target
        target.parentElement.removeChild(target);
    }
}

function errorCode(code) {
    const dic = {
        '200': '成功',
        '401': '认证失败，无法访问系统资源',
        '403': '当前操作没有权限',
        '404': '访问资源不存在',
        'default': '系统未知错误，请反馈给管理员'
    }
    return dic[code];
}

/**
 * 时间格式化
 * @param {String||Date} date 时间值
 * @param {String} formatStr 时间格式化参数,默认YYYY-MM-DD HH:mm:ss
 * 注: 本方法最低支持到秒的格式化，低于秒的部分会丢失处理
 */
export function formatTimeStr(date, formatStr){
    if (!date) {
        return '';
    }
    if (typeof date == "string") {
        if(date.length==10&&!formatStr){
            // 纯年月日字符串
            return `${date} 00:00:00`;
        }
        if(date.length==8&&!formatStr){
            // 时分秒
            return `2020-01-01 ${date}`;
        }
        date = date.replace(/\-/g, '/').replace(/\T/g, ' ');
        const index = date.indexOf(".");
        if (index >-1) {
            // 本方法最低支持到秒的格式化，低于秒的部分丢失处理
            date = date.substring(0,index);
        }
        date = new Date(date);
    }
    let year = date.getFullYear();
    let month = date.getMonth() + 1;
    let day = date.getDate();
    let hour = date.getHours();
    let minute = date.getMinutes();
    let second = date.getSeconds();
    let val = formatStr || 'YYYY-MM-DD HH:mm:ss';
    return val.replace('YYYY', formatNumber(year))
        .replace('MM', formatNumber(month))
        .replace('DD', formatNumber(day))
        .replace('HH', formatNumber(hour))
        .replace('mm', formatNumber(minute))
        .replace('ss', formatNumber(second));
}

//数字补0
export const formatNumber = n => {
    n = n.toString()
    return n[1] ? n : '0' + n
}

/**
 * 返回省略内容
 * @param text 
 * @param len 
 * @returns 
 */
export function ellipsisFunc(text,len) {
    let val;
    if (text&&text.length > len) {
        val = text.substring(0, len+1) + '...';
    } else {
        val = text;
    }
    return val;
}

/**
 * 数字转中文数值
 */
 export function toChineseBig(num) {
    if (num === null || num === undefined) return ''
    // 将接收到的num转换为字符串
    var strNum = String(num)
    // 定义单位
    // var unit = ['拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟']
    var unit = ['十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千']
    // 结果中放一个符号，用来解决最后的零去不掉的问题
    var result = ['@']
    // 单位下标
    var unitNo = 0
    // 从后往前遍历接收到的数据，省略结束条件
    for (let i = strNum.length - 1;; i--) {
      // 调用转大写函数，将每一个数字转换成中文大写，一次放入一个到结果数组中
      result.unshift(numToChinese(strNum[i]))
      // 如果不大于0
      if (i <= 0) {
        // 结束循环
        break
      }
      // 放入一个数字，放入一个单位
      result.unshift(unit[unitNo])
      // 单位下标加1
      unitNo++
    }
    // 将结果数组转换成字符串，并使用正则替换一些关键位置，让结果符合语法
    // return result.join('').replace(/(零[仟佰拾]){1,3}/g, '零').replace(/零{2,}/g, '零').replace(/零([万亿])/g, '$1').replace(/亿万/g, '亿').replace(/零*@/g, '')
    return result.join('').replace(/(零[千百十]){1,3}/g, '零').replace(/零{2,}/g, '零').replace(/零([万亿])/g, '$1').replace(/亿万/g, '亿').replace(/零*@/g, '')

    function numToChinese(n) {
      // var chineseBigNum = '零壹贰叁肆伍陆柒捌玖'
      var chineseBigNum = '零一二三四五六七八九'
      return chineseBigNum[n]
    }
}